﻿using System;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;

namespace WinForms.Framework.Utility
{
    /// <summary>
    /// フォーマットを管理しているクラスです。
    /// </summary>
    public static class Formater
    {
        /// <summary>
        /// コレクションインターフェースを解析して XML 形式にフォーマットします。
        /// </summary>
        /// <param name="argName" type="string">引数の名称を設定します。ここに設定した名称が XML の要素名として扱われます。</param>
        /// <param name="collection" type="ICollection">解析対象のコレクションインターフェースを設定します。</param>
        /// <returns type="string">XML 形式にフォーマットされた文字列を返します。</returns>
        public static string CollectionToXml(string argName, ICollection collection)
        {
            var xml = new StringBuilder();
            xml.Append(string.Format("<{0} count=\"{1}\">", argName, collection.Count));

            int collectionCount = 0;
            foreach (var item in collection)
            {
                string collectionArgName = "item-" + collectionCount;

                if (item is ICollection)
                {
                    // recursive call
                    xml.Append(CollectionToXml(collectionArgName, (ICollection)item));
                }
                else
                {
                    xml.Append(string.Format("<{0}>{1}</{0}>", collectionArgName, item));
                }

                collectionCount++;
            }

            xml.Append(string.Format("</{0}>", argName));
            return xml.ToString();
        }

        /// <summary>
        /// 数値を A から始まる Excel 形式のアルファベットに変換します。
        /// </summary>
        /// <param name="value" type="int">1 から始まる変換対象の数値を設定します。</param>
        /// <returns type="string">Excel 形式のアルファベットを返します。</returns>
        public static string ToExcelAlphabet(int value)
        {
            int dividend = value;
            string alphabet = "";

            while (dividend > 0)
            {
                var modulo = (dividend - 1) % 26;
                alphabet = Convert.ToChar(65 + modulo) + alphabet;
                dividend = (dividend - modulo) / 26;
            }

            return alphabet;
        }

        /// <summary>
        /// 全角数値を半角数値に変換します。
        /// </summary>
        /// <param name="value">変換対象の文字列を設定します。</param>
        /// <returns>変換後の文字列を返します。</returns>
        public static string ZenToHanNumber(string value)
        {
            // 変換対象
            var r = new Regex(@"[０-９]");
            string result = r.Replace(value, m =>
            {
                return ((char)(m.Value.ToCharArray()[0] - 65248)).ToString();
            });

            return result;
        }
    }
}
